package com.un.ebs.businessObject.service;

import com.alibaba.fastjson.JSONObject;
import com.un.ebs.core.metadata.Query;
import com.un.ebs.sys.domain.Column;

import java.util.List;
import java.util.Map;

/**
 * @Author zc
 * @ClassName SQLStrategy
 * @Description 各类数据库SQL生成策略
 * @Date 2021/1/14
 */
public interface SQLStrategy {
    /**
     * 生成非分页SQL语句
     *
     * @param tableName  表名称
     * @param sortName   排序字段
     * @param params     参数名称
     * @param columnList 字段列表
     * @return
     */
    String listSQL(String tableName, String sortName, Map<String, Object> params, List<Column> columnList);

    /**
     * 生成分页SQL语句
     *
     * @param tableName  表名称
     * @param sortName   自定义排序字段
     * @param pageIndex  页码
     * @param pageSize   页大小
     * @param params     参数
     * @param columnList 字段列表
     * @return
     */
    String pageListSQL(String tableName, String sortName, Integer pageIndex, Integer pageSize, Map<String, Object> params, List<Column> columnList);

    /**
     * 分页求汇总数据
     *
     * @param tableName 表名称
     * @return
     */
    String pageListCount(String tableName, String sortName, Map<String, Object> params, List<Column> columnList);

    /**
     * 生成根据ID查询一条数据SQL语句
     *
     * @param tableName  表名称
     * @param id         主键ID
     * @param columnList 字段列表
     * @return
     */
    String getById(String tableName, String id, List<Column> columnList);

    /**
     * 生成新增SQL语句
     *
     * @param tableName  表名称
     * @param json       新增数据值
     * @param columnList 字段列表
     * @return
     */
    String add(String tableName, JSONObject json, List<Column> columnList);

    /**
     * 生成更新SQL语句
     *
     * @param tableName  表名
     * @param json       值
     * @param columnList 字段列表
     * @return
     */
    String update(String tableName, JSONObject json, List<Column> columnList);

    /**
     * 生成删除SQL语句
     *
     * @param tableName          表名称
     * @param id                 主键ID
     * @param supportLogicDelete 是否支持逻辑删除
     * @param tenantId           租户Id
     * @return
     */
    String delete(String tableName, String id, Boolean supportLogicDelete, String tenantId);


    /**
     * 通用查询
     *
     * @param tableName  bo名称
     * @param query      通用查询对象
     * @param columnList 字段列表
     * @return
     */
    String querySQL(String tableName, Query query, List<Column> columnList);

    /**
     * 通用查询count
     *
     * @param tableName  bo名称
     * @param query      通用查询对象
     * @param columnList 字段列表
     * @return
     */
    String queryCount(String tableName, Query query, List<Column> columnList);
}
